package com.t.bricks.bussiness.service.systemparams.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.t.bricks.annotation.CacheLoad;
import com.t.bricks.annotation.CacheRebuild;
import com.t.bricks.bussiness.db.dao.systemparams.SystemParamsDao;
import com.t.bricks.bussiness.db.entity.systemparams.SystemParams;
import com.t.bricks.bussiness.service.systemparams.SystemParamsService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.function.date.TimeUtil;
import com.t.bricks.utils.function.encode.MD5Util;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 系统参数'SystemParams表'基本业务操作类接口实现
 */
@Service
public class SystemParamsServiceImpl implements SystemParamsService<SystemParams> {

	@Autowired
	private SystemParamsDao<SystemParams> systemParamsDao;
	
	@Value("${app.md5.key:未设置app.md5.key配置项}")
	private String appMd5Key;

	/**
	 * 新增
	 * @param systemParams 系统参数 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	@CacheRebuild(core="SystemParams", type="NoIntercept", rebuildMethod="findByNoIntercept")
	public MsgEmity add(Object systemParams) {
		MsgEmity me = ModuleUtil.objToEntity(systemParams, SystemParams.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		SystemParams systemParamsData = me.getData();
		
		me = ModuleUtil.validDbEntityByAdd(systemParamsData);// 通用的基本数据验证,如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = this.validByAdd(systemParamsData);
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(tmp.length() -4, tmp.length());// 数据一定不小于4位
			return me.setData(tmp);// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		systemParamsData.setsId(null);//清空记录编号
		
		me = ModuleUtil.supplyDbEntityAttrByAdd(systemParamsData);// 补充数据,如添加id、当前用户、当前时间等
		if (!me.isSuccess()) {
			return me;
		}
		
		//--添加验证完整性用的MD5值--//
		systemParamsData.setsMD5(createMD5Str(systemParamsData, appMd5Key));

		//--提交数据保存--//
		return systemParamsDao.add(systemParamsData);
	}

	/**
	 * 删除
	 * @param iVersion 数据版本号
	 * @param sId 表编号
	 * @return
	 */
	@Override
	@CacheRebuild(core="SystemParams", type="NoIntercept", rebuildMethod="findByNoIntercept")
	public MsgEmity del(Integer iVersion, String sId) {
		if (null == sId || "".equals(sId.trim())) {
			return new MsgEmity(false, "信息编号参数错误，请刷新重试！", 8001);
		}
		
		if (null == iVersion || iVersion.intValue() < 1) {
			return new MsgEmity(false, "信息版本参数错误，其值应大于0！", 8002);
		}

		return systemParamsDao.del(sId, iVersion);
	}

	/**
	 * 修改
	 * @param systemParams 系统参数 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	@CacheRebuild(core="SystemParams", type="NoIntercept", rebuildMethod="findByNoIntercept")
	public MsgEmity edit(Object systemParams) {
		MsgEmity me = ModuleUtil.objToEntity(systemParams, SystemParams.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		SystemParams systemParamsData = me.getData();
		
		me = ModuleUtil.validBaseDataByEdit(systemParamsData);// 通用的基本数据验证(编辑),如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}

		me = this.validByEdit(systemParamsData);
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(tmp.length() -4, tmp.length());//数据一定不小于4位
			return me.setData(tmp);// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		ModuleUtil.supplyDbEntityAttrByEdit(systemParamsData);// 补充数据
		
		//--添加验证完整性用的MD5值--//
		systemParamsData.setsMD5(createMD5Str(systemParamsData, appMd5Key));
		
		//--提交数据保存--//
		return systemParamsDao.edit(systemParamsData);//注意:更新成功后对象属性iVersion值将被+1
	}

	/**
	 * 创建验证完整性用的MD5值
	 * @param systemParams
	 * @param key
	 * @return
	 */
	private String createMD5Str(SystemParams systemParams, String key) {
		StringBuilder sb = new StringBuilder()
			.append(systemParams.getsId()).append(";")
			.append(systemParams.getsName()).append(";")
			.append(systemParams.getsEnglish()).append(";")
			.append(systemParams.getsValue()).append(";")
			.append(systemParams.getiMustLogin()).append(";")
			.append(systemParams.getsMemo()).append(";")
			.append(systemParams.getsCreator()).append(";")
			.append(TimeUtil.toStr(systemParams.getdCreateDate(), "yyyy-MM-dd HH:mm:00")).append(";")
			.append(systemParams.getsModifieder()).append(";")
			.append(TimeUtil.toStr(systemParams.getdModifiedDate(), "yyyy-MM-dd HH:mm:00")).append(";")
			.append(key).append(";");
		
		return MD5Util.md5(sb.toString());
	}

	/**
	 * 取所有免拦截系统参数对象集合
	 * @return
	 */
	@Override
	@CacheLoad(core="SystemParams", type="NoIntercept")
	public MsgEmity findByNoIntercept() {
		MsgEmity me = systemParamsDao.findByNoIntercept();//读库
		if (!me.isSuccess()) {
			return me;
		}
		
		List<SystemParams> list = me.getData();
		if (null == list || list.size() < 1) {
			return new MsgEmity(false, "获取数据信息为空！", 8001);
		}
		
		return MsgEmity.success(list, "查询成功");
	}
	
}
